# tokio 的管道

## [`broadcast channel`](https://docs.rs/tokio/latest/tokio/sync/broadcast/fn.channel.html)

```rust
pub fn channel<T: Clone>(capacity: usize) -> (Sender<T>, Receiver<T>)
```

创建一个有边界的、多生产者、多消费者管道。里面每个发送的值都会广播到所有活动的接受者。

实际容量可能大于初始参数指定的容量。

`Sender` 上发送的所有数据将按照发送顺序在每个活动的 `Receiver` 上可用。

`Sender` 可以从流程中的多个点克隆到 `send` 到同一管道，也可以从 `Arc` 并发使用。新的 `Receiver` 句柄是通过调用 `Sender::subscribe` 创建的。

如果所有 `Receiver` 句柄都被删除，则 `send` 方法将返回 `SendError`。同样的，如果所有 `Sender` 句柄都被删除，则 `recv` 方法将返回 `RecvError`。

## [`watch channel`](https://docs.rs/tokio/latest/tokio/sync/watch/fn.channel.html)

```rust
pub fn channel<T>(init: T) -> (Sender<T>, Receiver<T>)
```

创建一个监视管道，返回“发送”和“接收”句柄。

`Sender` 发送的所有值都将对 `Receiver` 句柄可见。只有最后发送的值可供 `Receiver` 使用。所有中间值都被丢弃。

## [`mpsc channel`](https://docs.rs/tokio/latest/tokio/sync/mpsc/fn.channel.html)

```rust
pub fn channel<T>(buffer: usize) -> (Sender<T>, Receiver<T>)
```

创建一个有边界的 MPSC 管道，用于在具有反压的异步任务之间进行通信。

该管道将缓冲最多提供数量的消息。一旦缓冲区已满，尝试发送新的消息将等待，直到从管道接收消息。提供的缓冲容量至少为1.

`Sender` 上发送的所有数据都将按照发送时的顺序在 `Receiver` 上可用。

`Sender` 可以从多个代码位置克隆到 `send` 到同一管道。仅支持一个 `Receiver`。

如果的尝试 `send` 时，`Receiver`断开连接，则 `send` 方法将返回 `SendError`；如果在尝试 `recv` 时，`Sender` 断开连接，则 `recv` 方法将返回 `None`。

## [`oneshot channel`](https://docs.rs/tokio/latest/tokio/sync/oneshot/fn.channel.html)

```rust
pub fn channel<T>() -> (Sender<T>, Receiver<T>)
```

创建一个一次性管道，用于跨异步任务发送单个值。

该函数返回单一的“发送”和“接收”句柄。`Sender` 句柄由生产者使用来发送值。消费者使用 `Receiver` 句柄来接收值。

每个句柄可用于单独的任务。
